/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
/*
* Created on 23/07/2005
*/
package com.python.pydev.analysis.messages;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.python.pydev.core.IToken;
import com.aptana.shared_core.string.FastStringBuffer;
import com.python.pydev.analysis.IAnalysisPreferences;
/**
* This is a message that's composed of several other messages. It can be used to create wild imports.
*
* @author Fabio
*/
public class CompositeMessage extends AbstractMessage {
public CompositeMessage(int type, IToken generator, IAnalysisPreferences prefs) {
super(type, generator, prefs);
}
public CompositeMessage(int type, int startLine, int endLine, int startCol, int endCol, IAnalysisPreferences prefs) {
super(type, startLine, endLine, startCol, endCol, prefs);
}
List<IMessage> msgs = new ArrayList<IMessage>();
/**
* This determines the maximum amount of messages that a composite message can have.
*
* This is used because if messages become too big, there may be problems to save them later,
* and when it becomes too big, it may not be worth to the user anyways.
*/
public static int MAXIMUM_NUMBER_OF_INTERNAL_MESSAGES = 15;
/**
* If true, a part of the message in this message was suppressed.
*/
private boolean addSupressMessage = false;
/**
* The cached inner message of this composite message
*/
private String shortMessage;
/**
* Add a component message to this composite.
*/
public void addMessage(IMessage msg) {
if (shortMessage != null) {
throw new RuntimeException("Cannot add more messages after it's own short message was requested.");
}
if (msgs.size() > MAXIMUM_NUMBER_OF_INTERNAL_MESSAGES) {
addSupressMessage = true;
return;
}
if (!msgs.contains(msg)) {
msgs.add(msg);
}
}
/**
* @return the message considering all the internal messages available.
*/
public String getShortMessage() {
if (shortMessage == null) {
FastStringBuffer buffer = new FastStringBuffer(msgs.size() * 40);
List<String> messages = new ArrayList<String>();
for (Iterator<IMessage> iter = msgs.iterator(); iter.hasNext();) {
IMessage msg = iter.next();
messages.add(msg.getShortMessage().toString());
}
//sort them accordingly
Collections.sort(messages);
for (Iterator<String> iter = messages.iterator(); iter.hasNext();) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(", ");
}
}
//let the user know if we suppressed something
if (addSupressMessage) {
buffer.append("... others suppressed");
}
shortMessage = buffer.toString();
}
return shortMessage;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CompositeMessage)) {
return false;
}
CompositeMessage m = (CompositeMessage) obj;
return m.getMessage().equals(getMessage());
}
@Override
public int hashCode() {
return getMessage().hashCode();
}
}